#pragma once

#include <sys/stat.h>
#include <sys/types.h>
#include <jsoncpp/json/json.h>

#include <chrono>
#include <fstream>
#include <iostream>

namespace mylog 
{
    namespace Util
    {
        class Date
        {
        public:
            /**
             * @return 返回当前的时间点的时间戳
             */
            static time_t Now();
        }; // class Date

        class File
        {
        public:
            /**
             * @param filename 文件名
             * @return 文件存在即为true；否则为false
             */
            static bool Exists(const std::string& filename);

            /**
             * @param filename 文件名
             * @return 文件的目录路径
             */
            static std::string Path(const std::string& filename);

            /**
             * 创建目录
             * @param path 文件的目录路径
             */
            static void CreateDirectory(const std::string& path);

            /**
             * @param filename 文件名
             * @return 文件的大小
             */
            static int64_t FileSize(const std::string& filename);

            /**
             * @param content [out] 文件的内容
             * @param filename [in] 文件名，指定的文件的内容将会输出到content中
             * @return 获取成功返回true；获取失败返回false
             */
            static bool GetContent(std::string& content, const std::string& filename);
        }; // class File

        class JsonUtil
        {
        public:
            /**
             * 将json对象转换成字符串
             * @param val [in] json对象
             * @param str [out] 序列化后的字符串
             * @return 序列化成功则返回true；失败则返回false
             */
            static bool Serialize(const Json::Value& val, std::string& str);
            
            /**
             * 将字符串转化成json对象
             * @param str [in] 字符串
             * @param val [out] json对象
             * @return 反序列化成功返回true；失败则返回false
             */
            static bool UnSerialize(const std::string& str, Json::Value& val);
        }; // class JsonUtil

        // 用于日志系统配置数据的结构体
        struct JsonData
        {
        private:
            JsonData();

        public:
            static JsonData* GetJsonData();
            
            size_t buffer_size;   // 缓冲区基础容量
            size_t threshold;     // 倍数扩容阈值，超出阈值则线性扩容
            size_t linear_growth; // 缓冲区线性扩容的增长量
            size_t flush_log;     // 控制日志同步到磁盘的时机，默认为0,1调用fflush，2调用fsync
            std::string backup_addr; // 日志备份服务的ip地址
            uint16_t backup_port;    // 日志备份服务的端口
            size_t thread_count;      // 完成日志备份任务的线程数
        }; // class JsonData
    } // namespace Util

} // namespace log